package com.tool.genxml.handler;

import cn.hutool.core.collection.CollUtil;
import com.tool.genxml.entity.MergedRegion;
import com.tool.genxml.entity.XRow;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;


/**
 * 报文标准sheet页处理类
 * @author: zhoubin
 * @date: 2024/3/26
 */
public class MsgSheetHandler extends SheetHandler {

    /**
     * sheet页转换之后的行列表
     */
    private List<XRow> rows = new ArrayList<>();

    /**
     * 组件处理类
     */
    private ComponentHandler componentHandler;

    public MsgSheetHandler(XSSFSheet sheet, ComponentHandler componentHandler) {
        super(sheet);
        this.componentHandler = componentHandler;
    }

    @Override
    public void assembleComponent() {
        if (Objects.isNull(componentHandler)) {
            return;
        }

        this.rows = componentHandler.assembleComponent(rows);
    }

    @Override
    public void analysisSheet() {

        int rowNum = getSheet().getPhysicalNumberOfRows();

        for (int i = 2; i < rowNum;) {
            XSSFRow row = getSheet().getRow(i);
            // 获取当前行所有单元格
            Map<Integer, MergedRegion> rowRegions = getRowRegion(i);
            // 判断是否为合并单元格，如果不是合并的单元格，则该行的后面的所有单元格都不是合并的单元格。
            if (CollUtil.isEmpty(rowRegions)) {
                XRow xRow = XRow.of(row);

                // 判断当前行是否有组件，如果有，则标记当前页含有组件
                signComponent(xRow);

                rows.add(xRow);
                i++;
            } else {
                // 获取当前行的合并单元格的总行数
                int lineCount = rowRegions.get(0).getLineCount();

                // 组装带有合并单元格的行
                XRow xRow = assembleXRow(row, rowRegions);

                signComponent(xRow);

                rows.add(xRow);

                // 下一次循环从合并单元格的下一个单元格开始计算
                i += lineCount;
            }
        }
    }

    /**
     * // 判断当前行是否有组件，如果有，则标记当前页含有组件
     * @param xRow
     */
    private void signComponent(XRow xRow) {
        if (xRow.isHasComponent() && !isHasComponent()) {
            setHasComponent(true);
        }
    }

    /**
     * 获取列表大小
     * @return
     */
    public int rowNum() {
        return rows.size();
    }

    /**
     * 根据索引获取列表中的值
     * @param index
     * @return
     */
    public XRow getRowByIndex(int index) {
        return rows.get(index);
    }
}
